package work.jame.blog.framework.limit;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义的限流策略
 * 两种操作
 * <p>
 * A. 通过RequestLimitInterceptor#addGlobalRequestLimitHandler
 * 添加一个全局限流处理器,即任何请求都会进入该处理器
 * <p>
 * B. 通过@RequestLimit注解上指定具体的请求执行处理器
 *
 * @author : Jame
 * @date : 2023-05-13 11:11
 * @see RequestLimit
 **/
public abstract class AbstractRequestLimitHandler {


    /**
     * 自定义限流策略执行方法
     * <p>
     * 例如将发送请求非常多的ip添加到黑名单
     *
     * @param request  request
     * @param response response
     * @return Operation
     */
    public abstract Operation handler(HttpServletRequest request, HttpServletResponse response);

    /**
     * 获取执行顺序
     * 值越小越先执行
     * @return int 执行顺序
     */
    public int getOrder() {
        return 1;
    }



    /**
     * 限流操作类
     * 作为返回值
     */
    public enum Operation {
        ALLOW, //允许通过,继续执行其他限流处理(如果有的话)
        PROHIBIT,//禁止通过,直接结束此次请求
        SKIP //允许通过,并且跳过其他限流处理(如果有的话)
    }

}
